package cn.bugstack.springframework.aop.framework.adapter;

import cn.bugstack.springframework.aop.MethodBeforeAdvice;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;

/**
 * 这段代码定义了一个实现了 MethodInterceptor 接口的拦截器 MethodBeforeAdviceInterceptor。
 * 用于执行 MethodBeforeAdvice 的前置通知。
 * MethodBeforeAdviceInterceptor 类实现了 MethodInterceptor 接口，这意味着它可以拦截方法的调用，并在方法执行前后执行一些额外的逻辑。
 * 该类有一个成员变量 advice，类型为 MethodBeforeAdvice，用于存储前置通知对象。
 * 有两个构造函数：一个是无参构造函数，另一个是接收 MethodBeforeAdvice 参数的构造函数，用于设置前置通知对象。
 * invoke 方法是 MethodInterceptor 接口的方法，它在方法调用时被调用。
 * 在该方法中，首先调用前置通知对象的 before 方法，将目标方法、方法参数和目标对象传递给它，然后调用 MethodInvocation 对象的 proceed 方法继续执行方法调用链。
 * 这段代码的作用是实现了一个前置通知拦截器，用于在方法调用之前执行额外的逻辑，如日志记录、权限检查等。
 *
 */

public class MethodBeforeAdviceInterceptor implements MethodInterceptor {

    private MethodBeforeAdvice advice;

    public MethodBeforeAdviceInterceptor() {
    }

    public MethodBeforeAdviceInterceptor(MethodBeforeAdvice advice) {
        this.advice = advice;
    }

    @Override
    public Object invoke(MethodInvocation methodInvocation) throws Throwable {
        this.advice.before(methodInvocation.getMethod(), methodInvocation.getArguments(), methodInvocation.getThis());
        return methodInvocation.proceed();
    }

    public MethodBeforeAdvice getAdvice() {
        return advice;
    }

    public void setAdvice(MethodBeforeAdvice advice) {
        this.advice = advice;
    }

}

/**
 * 在Spring框架中，MethodBeforeAdvice和MethodBeforeAdviceInterceptor的区别以及联系?
 *
 * MethodBeforeAdvice 接口：
 * MethodBeforeAdvice 接口是 Spring AOP 中定义的用于实现方法前置通知的接口。
 * 它定义了一个 before 方法，用于在目标方法执行之前执行特定的操作。
 * 实现了该接口的类可以在 before 方法中编写需要在目标方法执行之前执行的逻辑。
 *
 * MethodBeforeAdviceInterceptor 类：
 * MethodBeforeAdviceInterceptor 类是 Spring AOP 提供的实现了 MethodInterceptor 接口的具体类，用于实现方法前置通知的拦截器。
 * 它实现了 MethodInterceptor 接口的 invoke 方法，可以在目标方法执行之前和之后执行一些额外的逻辑。
 * 在 invoke 方法中，它会调用 MethodBeforeAdvice 接口的实现类的 before 方法，从而实现方法前置通知的功能。
 *
 * 联系：
 *
 * MethodBeforeAdviceInterceptor 类是 MethodBeforeAdvice 接口的一种具体实现，它实现了拦截器的功能，
 * 并且在内部调用了 MethodBeforeAdvice 接口的实现类的 before 方法。
 *
 * 当 Spring AOP 配置了方法前置通知时，实际上是配置了 MethodBeforeAdviceInterceptor 类，
 * 并将实现了 MethodBeforeAdvice 接口的类（如自定义的方法前置通知类）作为参数传递给拦截器，从而在目标方法执行之前执行特定的操作。
 *
 * 总的来说，MethodBeforeAdvice 接口是定义了方法前置通知的标准，
 * 而 MethodBeforeAdviceInterceptor 类则是 Spring AOP 中提供的实现了拦截器功能的具体类，用于实现方法前置通知的拦截器逻辑。
 * 在实际使用中，通常配置 MethodBeforeAdviceInterceptor 类并将方法前置通知的实现类传递给拦截器。
 */